#include "./BSP/EXTI/exti.h"

void Exti_Init(void)
{
	GPIO_InitTypeDef gpio_init_struct;
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOH_CLK_ENABLE();
	__HAL_RCC_GPIOC_CLK_ENABLE();
	
	//key_up
	gpio_init_struct.Pin = GPIO_PIN_0;
	gpio_init_struct.Mode = GPIO_MODE_IT_RISING;
	gpio_init_struct.Pull = GPIO_PULLDOWN;
	gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA,&gpio_init_struct);
	HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);
	HAL_NVIC_EnableIRQ(EXTI0_IRQn);
	
	//key0
	gpio_init_struct.Pin = GPIO_PIN_3;
	gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;
	gpio_init_struct.Pull = GPIO_PULLUP;
	gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOH,&gpio_init_struct);
	HAL_NVIC_SetPriority(EXTI3_IRQn,2,0);
	HAL_NVIC_EnableIRQ(EXTI3_IRQn);
	
	//key1
	gpio_init_struct.Pin = GPIO_PIN_2;
	gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;
	gpio_init_struct.Pull = GPIO_PULLUP;
	gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOH,&gpio_init_struct);
	HAL_NVIC_SetPriority(EXTI2_IRQn,2,0);
	HAL_NVIC_EnableIRQ(EXTI2_IRQn);
	
	//key2
	gpio_init_struct.Pin = GPIO_PIN_13;
	gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;
	gpio_init_struct.Pull = GPIO_PULLUP;
	gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOC,&gpio_init_struct);
	HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,0);
	HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}

void EXTI0_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}

void EXTI2_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
}

void EXTI3_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}

void EXTI15_10_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	delay_ms(20);
	if(GPIO_Pin == GPIO_PIN_0)//key_up
	{
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == 1)
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
		}
	}
	
	if(GPIO_Pin == GPIO_PIN_3)//key0
	{
		if(HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_3) == 0)
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
		}
	}
	
	if(GPIO_Pin == GPIO_PIN_2)//key1
	{
		if(HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_2) == 0)
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
		}
	}
	
	if(GPIO_Pin == GPIO_PIN_13)//key2
	{
		if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == 0)
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
		}
	}
}

